package Test.优先队列;

/**
 * @ClassName a
 * @since: 2023/9/5 10:19
 * @auth: kirito
 * @description:
 * 为了实现按照越靠近60的值的优先级越高的要求，我们可以自定义一个Comparator来对元素进行比较，
 *  并根据与60的差值来确定优先级。
 **/
import java.util.Comparator;
import java.util.PriorityQueue;

/*      移除的元素：58
        移除的元素：55
        移除的元素：63
        移除的元素：50
        移除的元素：70*/

/*在上述示例中，我们创建了一个PriorityQueue对象，并使用自定义的CloseTo60Comparator比较器。
        比较器根据每个元素与60的差值来确定优先级。较小的差值意味着较高的优先级。
        然后，我们向队列中添加一些整数，并使用poll()方法按优先级移除并打印队列中的元素。

        根据自定义的比较器，元素58在60附近的差值最小，因此优先级最高，先被移除。
        接着是55、63、50和70。*/
public class PriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个优先级队列，并使用自定义比较器
        PriorityQueue<Integer> pq = new PriorityQueue<>(new CloseTo60Comparator());

        // 添加元素到队列
        pq.offer(50);
        pq.offer(70);
        pq.offer(55);
        pq.offer(63);
        pq.offer(58);

        // 打印队列中的元素（按优先级顺序）
        while (!pq.isEmpty()) {
            System.out.println("移除的元素：" + pq.poll());
        }
    }
}

// 自定义比较器，根据与60的差值来确定优先级
class CloseTo60Comparator implements Comparator<Integer> {
    @Override
    public int compare(Integer num1, Integer num2) {
        int diff1 = Math.abs(num1 - 60);
        int diff2 = Math.abs(num2 - 60);
        return Integer.compare(diff1, diff2);
    }
}